// 用来定义用户表单验证模块

// 导入定义表单验证规则模块  npm install joi@17.1.0  原来的@hapi/joi被弃用
const joi = require('joi')

/*
 * string() 值必须是字符串 
 * alphanum() 值只能是包含 a-zA-Z0-9 的字符串
 * required() 值是必填项，不能为 undefined 
 * pattern(正则表达式) 值必须符合正则表达式的规则 
 * dataUri() 指的是如下格式的字符串数据：
 */
// username password id nickname email 的验证规则
const username = joi.string().alphanum().min(6).max(12).required()
const password = joi.string().pattern(/^[\S]{6,12}$/).required()  //注释:/S表示不能空格
const id = joi.string().min(1).required()
const nickname = joi.string().max(6).required()
const email = joi.string().email().required()
const avatar = joi.string().dataUri().required()

// 定义注册和登录表单的验证规则对象
exports.user_schema = {
  // 表示需要对 req.body 中的数据进行验证
  body: {
    username,
    password
  }
}
// 定义更改用户信息的验证规则对象
exports.userinfo_schema = {
  body: {
    id,
    nickname,
    email
  }
}
// 定义重置密码的验证对象
// 核心验证思路：旧密码与新密码，必须符合密码的验证规则，并且新密码不能与旧密码一致！
exports.resetPwd = {
  body: {
    // 使用 password 这个规则，验证 req.body.oldPwd 的值
    oldPwd: password,
    // 使用 joi.not(joi.ref('oldPwd')).concat(password) 规则，验证 req.body.newPwd 的值
    // 解读：
    // 1. joi.ref('oldPwd') 表示 newPwd 的值必须和 oldPwd 的值保持一致
    // 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值
    // 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 password 这两条验证规则
    newPwd: joi.not(joi.ref('oldPwd')).concat(password),
  }
}
// 定义用户头像的规则对象
exports.update_avatar = {
  body: {
    avatar
  }
}